# monitor/schemas.py
from pydantic import Field
from datetime import datetime
from typing import List, Optional

from ninja import Schema


class DiskMetrics(Schema):
    """磁盘指标数据, 用于表示单个磁盘的性能指标数据"""

    device: str  # 磁盘设备名称(如: /dev/sda1)
    mountpoint: str  # 磁盘挂载点(如: /、/home等)
    fstype: str  # 文件系统类型(如：ext4、ntfs等)
    total: int  # 磁盘总容量(字节)
    used: int  # 磁盘已使用容量(字节)
    free: int  # 磁盘剩余容量(字节)
    percent: float  # 磁盘使用百分比(0-100)


class GPUMetrics(Schema):
    """GPU指标数据, 用于表示单个GPU的性能指标数据"""

    index: int  # GPU 索引号
    uuid: str  # GPU 唯一标识符
    name: str  # GPU 名称/型号
    temperature: Optional[float] = None  # GPU 温度(摄氏度)
    fan_speed: Optional[float] = None  # 风扇转速(百分比或 RPM, 取决于具体实现)
    memory_used: int  # 已使用的显存(字节)
    memory_total: int  # 显存总量(字节)
    gpu_utilization: Optional[float] = None  # GPU 利用率(百分比)
    power_draw: Optional[float] = None  # 当前功耗(瓦特)
    power_limit: Optional[float] = None  # 功耗限制(瓦特)


class MetricsIn(Schema):
    """查询指标输入参数, 用于接收查询服务器性能指标历史数据的参数"""

    start_time: Optional[datetime] = None  # 查询开始时间(默认为1小时前)
    end_time: Optional[datetime] = None  # 查询结束时间(默认为当前时间)
    limit: Optional[int] = 60  # 返回记录数限制(默认60条)


class MetricsOut(Schema):
    """服务器性能指标输出, 用于返回服务器各项性能指标的完整数据"""

    time: datetime  # 指标记录时间戳
    cpu_percent: float = Field(..., alias="cpu_percent")  # 总体 CPU 使用率(百分比)
    cpu_user: float  # 用户空间 CPU 使用率(百分比)
    cpu_system: float  # 系统空间 CPU 使用率(百分比)
    cpu_iowait: float  # I/O 等待 CPU 使用率(百分比)
    cpu_core_count: int  # CPU 核心数量
    per_core_usage: List[float]  # 每个 CPU 核心的使用率列表(百分比)
    memory_total: int  # 内存总量(字节)
    memory_available: int  # 可用内存量(字节)
    memory_percent: float  # 内存使用率(百分比)
    memory_used: int  # 已使用内存量(字节)
    memory_free: int  # 空闲内存量(字节)
    disk_metrics: List[DiskMetrics]  # 磁盘指标列表(包含所有磁盘的信息)
    network_bytes_sent: int  # 网络发送字节数
    network_bytes_recv: int  # 网络接收字节数
    network_packets_sent: int  # 网络发送数据包数
    network_packets_recv: int  # 网络接收数据包数
    gpu_metrics: List[GPUMetrics]  # GPU 指标列表(包含所有GPU的信息)
